#include<iostream>
#include<unistd.h>
#include<sys/wait.h>

// int main()
// {
//     std::cout<<"hello world"<<std::endl;
//     std::cout<<"hello world"<<std::endl;
//     std::cout<<"hello world"<<std::endl;
//     std::cout<<"hello world"<<std::endl;

//     std::cerr<<"hello bit"<<std::endl;
//     std::cerr<<"hello bit"<<std::endl;
//     std::cerr<<"hello bit"<<std::endl;
//     std::cerr<<"hello bit"<<std::endl;
//     return 0;
// }

// int main()
// {
//     int fd[2];
//     int ret=pipe(fd);
//     if(ret<0)
//     {
//         std::cerr<<"pipe error"<<std::endl;
//         return 1;
//     }

//     int id = fork();
//     //创建进程后，父子进程需要各自关闭一个读写端
//     //我们这里让子进程写，父进程读
//     if(id==0)
//     {
//         //子进程
//         ::close(fd[0]);
//         int cnt=0;

//         while(1)
//         {
//             std::string message="hello world,";
//             message+=std::to_string(getpid());
//             message+=",";
//             message+=std::to_string(cnt++);
//             write(fd[1],message.c_str(),message.size());
//             sleep(1);
//         }

//         exit(0);
//     }
//     else if(id>0)
//     {
//         //父进程
//         ::close(fd[1]);

//         char buffer[1024];
//         while(1)
//         {
//             ssize_t s=read(fd[0],buffer,1024);
//             if(s>0)
//             {
//                 buffer[s]=0;//将读取到的内容结尾添加'\0'，因为字符串以\0结尾时C语言的规定，系统调用write时可没这个规定
//                 //write写入的时候是不需要size+1的，我们就没有写入\0，这里需要手动补上
//                 std::cout<<"parent read:"<<buffer<<std::endl;
//             }
//         }
//         pid_t pid=waitpid(id,nullptr,0);
//     }
//     return 0;
// }


int main()
{
    int fd[2];
    int ret=pipe(fd);
    if(ret<0)
    {
        std::cerr<<"pipe error"<<std::endl;
        return 1;
    }

    int id = fork();
    //创建进程后，父子进程需要各自关闭一个读写端
    //我们这里让子进程写，父进程读
    if(id==0)
    {
        //子进程
        ::close(fd[0]);
        int total = 0;
        int cnt=0;
        while(1)
        {
            std::string message="h\n";

            total += ::write(fd[1], message.c_str(), message.size());
            cnt++;
            std::cout << "total: " << total << std::endl;
            //继续无限循环break;//结束循环
        }

        exit(0);
    }
    else if(id>0)
    {
        //父进程
        ::close(fd[1]);

        // char buffer[1024];
        // //sleep(10);
        // while(1)
        // {
        //     ssize_t s=read(fd[0],buffer,1024);
        //     if(s>0)
        //     {
        //         buffer[s]=0;
        //         std::cout<<"parent read:"<<buffer<<std::endl;
        //     }
        //     else if(s==0)
        //     {
        //         std::cout<<"child quit"<<std::endl;
        //     }
        //     sleep(1);
        // }
        ::close(fd[0]);//关闭读端
        int status=0;
        pid_t pid=waitpid(id,&status,0);

        std::cout<<"child quit signal:"<<((status>>8)&0xFF) << " child quit code:"<<(status&0x7F)<<std::endl;
    }
    return 0;
}